#include "03_ThreadPool.h"
#include <iostream>

using std::cout;
using std::endl;

#define LOG_WHERE() \
    std::clog << "[DEBUG] " << __FILE__ << ":" << __LINE__ << " (" << __FUNCTION__ << ")\n"

void MyTask(size_t _data){
    cout << "data : " << _data << '\n';
}

// 尽量走引用，能不写返回值就不写返回值
size_t MyTask2(size_t& i) {  // 注意：通过引用修改外部变量
    std::cout << "Before increment: " << i << std::endl;
    return ++i;  // 返回递增后的值
}

void test(){
    // 1: 创建线程池
    LOG_WHERE();
    ThreadPool pool(4, 10);

    // 3: 开始线程池
    LOG_WHERE();
    pool.start();
    
    // 2: 创建对象
    LOG_WHERE();
    for(int i = 0; i < 20; ++i)
    {
        // pool.addTask(std::bind(&MyTask, static_cast<size_t>(i)));
        
        pool.addTask([i]{ MyTask(i); });    // lambda匿名函数
        
        // pool.addTask([&i]{
        //    size_t result = MyTask2(i); 
        // });    // lambda匿名函数
    }

    // 4: 停止线程池
    LOG_WHERE();
    pool.stop();
}

int main()
{
    test();
    return 0;
}

